/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package op;

import core.QuebraString;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author Jônatas
 */
public class QuebraStringVivo2 implements QuebraString {

    public QuebraStringVivo2() {
    }
    public static Pattern pattern0500 = Pattern.compile("0[0-9]00[0-9]{7}");
    public static Pattern patternValor = Pattern.compile("[0-9]+[,][0-9]{2}");
    public static Pattern patternAst555 = Pattern.compile("([*][0-9]{3}|[0-9]{5}?)");
    public static Pattern patternDDI = Pattern.compile("[0-9]{12}");
    public static Pattern patternData = Pattern.compile("[0-9]{2}/[0-9]{2}/[0-9]{4}");

    /**
     * Parameters needed inside parametersMap:
     *
     * <br>{@link Telefone} - Telefone de origem mapped by the key "origem".
     * <br>{@link String} - Tipo mapped by the key "tipo".
     * <br>{@link Boolean} - A cobrar mapped by the key "aCobrar".
     * <br>{@link String} - Line mapped by the key "line".
     *
     * @param parametersMap A map with the parameters.
     *
     * @return EntradaAbstrata
     *
     * @throws Exception
     */
    public EntradaAbstrata quebraString(Map<String, Object> parametersMap) throws Exception {

        Telefone origem = (Telefone) parametersMap.get("origem");
        String tipo = (String) parametersMap.get("tipo");
        boolean aCobrar = ((Boolean) parametersMap.get("aCobrar")).booleanValue();
        String line = (String) parametersMap.get("line");

        EntradaAbstrata entrada = null;

        Matcher matchTempo = CreateContaVivo2.tempo.matcher(line);

        boolean horaOrigem = false;
        String strHoraOrigem = "";
        int fimHoraOrigem = -1;

        if (!(tipo.equals("Descontos") || tipo.equals("Serviços Adicionais"))) {
            horaOrigem = matchTempo.find();
            strHoraOrigem = matchTempo.group();
            fimHoraOrigem = line.indexOf(strHoraOrigem) + strHoraOrigem.length();
        }

        int fimLocal = -1;

        Matcher matchData = CreateContaVivo2.data.matcher(line);
        matchData.find();

        String data = "";

        if (!tipo.equals("Descontos")) {
            data = matchData.group();
        }
        if (tipo.equals("Serviços Adicionais") || tipo.equals("Planos Contratados")) {

            entrada = new Ligacao();

            Matcher matchValor = patternValor.matcher(line);
            matchValor.find();

            String valorStr = matchValor.group().trim();

            double valor = Double.parseDouble(valorStr.replace(",", "."));
            entrada.setCusto(valor);

            if (tipo.equals("Planos Contratados")) {
                tipo = "Plano - ";
            } else {
                tipo = "";
            }

            tipo += line.replace(valorStr, "").trim();

            int fim = tipo.indexOf(data);

            tipo = tipo.substring(0, fim).trim();

            entrada.setDuracaoLigacaoSegundos(new Integer(60));
            entrada.setTipoDeLigacao(tipo);
            entrada.setPlanoLigacao(tipo);
            entrada.setNumeroDeOrigem(origem);
            entrada.setDestino(new Telefone("", true));
            return entrada;

        } else if (tipo.equals("Descontos")) {

            entrada = new Ligacao();

            Pattern patternDescontos = Pattern.compile("[0-9]+[,][0-9]{2}[^%]");

            Matcher matchValor = patternDescontos.matcher(line);
            matchValor.find();
            String valorStr = matchValor.group();
            double valor = Double.parseDouble(valorStr.replace(",", "."));
            entrada.setCusto(valor * (-1.0));

            tipo = "Descontos - " + line.replace(valorStr, "").trim();

            entrada.setDuracaoLigacaoSegundos(new Integer(60));
            entrada.setTipoDeLigacao(tipo);
            entrada.setPlanoLigacao(tipo);
            entrada.setNumeroDeOrigem(origem);
            entrada.setDestino(new Telefone("", true));
            return entrada;
        } else if (horaOrigem && (matchTempo.find() || tipo.equals("Torpedos"))) {
            entrada = new Ligacao();
            Telefone destino = null;

            Matcher match0500 = pattern0500.matcher(line);
            boolean eh0500 = match0500.find();

            Matcher matchAst555 = patternAst555.matcher(line);

            Matcher matchDDI = patternDDI.matcher(line);

            int inicioDestino = -1;
            int fimDestino = -1;

            if (eh0500) {
                String str0500 = match0500.group();
                destino = new Telefone(str0500, eh0500);
                inicioDestino = line.indexOf(str0500);
                fimDestino = inicioDestino + str0500.length();
            } else if (matchAst555.find()) {
                String strAst = matchAst555.group();
                destino = new Telefone(strAst, true);
                inicioDestino = line.indexOf(strAst);
                fimDestino = inicioDestino + strAst.length();
            } else if (line.contains("AUXILIO A LISTA")) {
                String strAst = "102";
                destino = new Telefone(strAst, true);
                inicioDestino = line.indexOf(strAst);
                fimDestino = inicioDestino + strAst.length();
            } else if (matchDDI.find()) {

                String foneStr = matchDDI.group();

                destino = new Telefone(foneStr);

                inicioDestino = line.indexOf(foneStr);
                fimDestino = inicioDestino + foneStr.length();
            } else {
                Matcher matchTelefone = CreateContaVivo2.telefoneDDD.matcher(line);
                boolean found = matchTelefone.find();

                if (!found) {
                    return null;
                }

                String foneStr = null;

                foneStr = matchTelefone.group();

                destino = CreateContaVivo2.createTelefone(foneStr);

                inicioDestino = line.indexOf(foneStr);
                fimDestino = inicioDestino + foneStr.length();
            }

            entrada.setDestino(destino);

            String duracao = null;

            if (!tipo.equals("Torpedos")) {
                duracao = matchTempo.group();
            } else {
                duracao = "00h01m00s";
            }

            Integer tempo = EntradaAbstrata.getDuracaoLigacaoSegundos(duracao);

            if (line.contains("ADICIONAL")) {
                tipo = "ADICIONAL";
            } else if (line.contains("DESLOCAMENTO2")) {
                tipo = "DESLOCAMENTO2";
            }

            //int inicioDuracao = line.indexOf(duracao);

            //String plano = line.substring(fimDestino, inicioDuracao).trim();

            if (aCobrar) {
                entrada.setDuracaoLigacaoACobrarSegundos(tempo);
            } else {
                entrada.setDuracaoLigacaoSegundos(tempo);
            }

            fimLocal = inicioDestino;

        } else {
            entrada = new OutrasCobrancas();

            if (tipo.equals("Torpedos")) {
                Matcher matchTelefone = CreateContaVivo2.telefoneDDD.matcher(line);
                matchTelefone.find();

                String foneStr = matchTelefone.group();
                Telefone destino = CreateContaVivo2.createTelefone(foneStr);

                entrada.setDestino(destino);
                fimLocal = line.indexOf(foneStr);

            } else if (tipo.equals("Vivo Internet") || tipo.equals("Vivo Wap")) {
                fimLocal = line.indexOf("INTERNET");
            }
        }

        entrada.setDataOrigemLigacao(createDate(data, strHoraOrigem));
        entrada.setNumeroDeOrigem(origem);

        Matcher matchValor = patternValor.matcher(line);
        matchValor.find();
        String strValor = matchValor.group();
        double custo = Double.parseDouble(strValor.replace(",", "."));

        if (custo == 0) {
            tipo += " franqueado";
        }

        entrada.setPlanoLigacao(tipo);

        if (entrada.isLigacao()) {
            entrada.setTipoDeLigacao(tipo);
        }

        entrada.setCusto(custo);

        if (fimLocal == -1) {
            fimLocal = line.indexOf(strValor);
        }

        entrada.setLocalDaLigacao(line.substring(fimHoraOrigem, fimLocal).trim());




        return entrada;
    }

    public static Date createDate(String data, String hora) {
        Calendar calendar = Calendar.getInstance();

        String[] dia = data.split("/");

        int year = Integer.parseInt("20" + dia[2]);
        int month = Integer.parseInt(dia[1]);
        int date = Integer.parseInt(dia[0]);

        int hourOfDay = Integer.parseInt(hora.substring(0, 2));
        int minute = Integer.parseInt(hora.substring(3, 5));
        int second = Integer.parseInt(hora.substring(6, 8));

        calendar.set(year, month, date, hourOfDay, minute, second);

        return calendar.getTime();
    }
}
